package parsageInstances;

import heuristiquegloutonne.Job;
import heuristiquegloutonne.Machine;
import heuristiquegloutonne.Operation;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Parsage {
	
	private ArrayList<Machine> machines;
	private ArrayList<Job> jobs;
	private int nbJobs;
	private int nbMachines;
	
	
	
	public Parsage (String nomFichier) throws NumberFormatException, IOException {
		
		/*elements qui vont etre crees avec le parsage*/
		 this.nbJobs=0;
		 this.nbMachines=0;
		 this.machines = new ArrayList<Machine>();
	     this.jobs = new ArrayList<Job>();
	     
	     
	     /*Lecture du fichier entree*/
	  	 InputStream ips = new FileInputStream(nomFichier);
	  	 InputStreamReader ipsr = new InputStreamReader(ips);
	  	 BufferedReader br = new BufferedReader(ipsr);
	  	 
	  	String ligne;
	  	int numDeLigne = -1;
	  	String[] listeValeurs;
		// Pour chaque ligne du fichier d'entree
		while ((ligne = br.readLine()) != null) {
			//sur la premiere ligne on lit le nombre de jobs et le nombre de machines
			if(numDeLigne==-1){
				//on a une liste de valeurs separees par " "
				listeValeurs = ligne.split(" ");
				this.nbJobs=Integer.parseInt(listeValeurs[0]);
				this.nbMachines=Integer.parseInt(listeValeurs[1]);
				
				//on cree les jobs et les machines
				for(int i = 0; i < this.nbMachines; i++) { this.machines.add(new Machine(i)); }
		        for(int i = 0; i < this.nbJobs; i++) { this.jobs.add(new Job(i)); }
			}
			else{
				/*
				 * ensuite on a une ligne du document par job
				 * avec alternativement une information sur la machine consideree et le temps pour 
				 * faire la tache sur cette machine
				 */
				
				//on a une liste de valeurs separees par " " qu'on recupere dans une liste de String
				String delimiteur = "[ ]+";
				listeValeurs = ligne.split(delimiteur);
				
				int id=0;
				int dateDeb=0;
				int duree=0;
				
				//tant qu'on n'est pas arrive a la fin de la ligne
				while (id<listeValeurs.length) {
					
					//on calcule la duree de l'operation (si id=0 c'est que c'est la premiere operation dans la liste)
					dateDeb=dateDeb+duree;
					//on cree l'operation
					Operation op = new Operation(this.machines.get(Integer.parseInt(listeValeurs[id])), this.jobs.get(numDeLigne), Integer.parseInt(listeValeurs[id+1]), dateDeb);
					//et on l'ajoute a son job qui correspond au numero de ligne
					duree = Integer.parseInt(listeValeurs[id+1]);
					this.jobs.get(numDeLigne).addOperation(op);
					//on incremente l'id de l'operation pour passer au prochain couple machine/duree
					id=id+2;
				}
			}
			//on passe a la ligne suivante, on incremente le numero de ligne
			numDeLigne++;
		}
		
		/*affichage pour tester le resultat du parsage*/
		System.out.println("*** PARSAGE ***");
		System.out.println("nb jobs : "+ nbJobs);
		System.out.println("nb machines : "+ nbMachines);
		for(Job j : this.jobs) {
            System.out.print((j.getId()+1)+" => ");
            for (Operation o : j.getOperations()) {
                System.out.print("machine : "+(o.getMachine().getNum())+", duree : "+o.getDuree()+", date debut : "+o.getDate_debut()+" ; ");
            }
            System.out.println();
        }
	  	 
	}


	public ArrayList<Machine> getMachines() {
		return machines;
	}


	public ArrayList<Job> getJobs() {
		return jobs;
	}


	public int getNbJobs() {
		return nbJobs;
	}

	public int getNbMachines() {
		return nbMachines;
	}

}
